/**
 * 字符串截取操作
 * @description 字符串操作工具类
 * @example 代码示例
 * new UtilString()
 * @constructor 这个是一个构造函数
 * @extends 继承与String 
 * 
 */

import { fileType } from "../Interface/util_Interface";

export class UtilString extends String {

  public partition!: string | undefined;
  constructor(_mail?: string | undefined) {
    super();
    this.partition = _mail
  }

  /**
   * 字符串转为数字 ASCII值
   * @param txt 数据源
   * @param chaos 膨胀倍数
   * @returns Array<number>
   */
  static TextToASCII(txt: string, chaos?: number): Array<number> {
    let AD: Array<number> = [];
    for (let i = 0; i < txt.length; i++) {
      chaos ? AD.push(String(txt[i]).charCodeAt(0) * chaos) : AD.push(String(txt[i]).charCodeAt(0))
    }
    return AD
  }

  /**
   * ASCII值转为数字
   * @param AD 数据源
   * @param chaos 配置倍数
   * @returns 
   */
  static ASCIIToText = (AD: Array<number>, chaos?: number) => AD.map((item: number) => chaos ? (String.fromCharCode(item / chaos)) : (String.fromCharCode(item)))


  /**
  * 截取字符串中最后出现的指定字符串
  * @param str 截取字符串
  * @param findStr 截取指定标识
  * @returns 
  */
  // static getSpecifyTxt(str: string, findStr = "."): any {
  //   if (!str) return;
  //   const partition = str?.lastIndexOf(findStr);
  //   return str.substring(partition, str.length);
  // }

  /**
 * 身份证或者手机号脱敏
 * @param val 脱敏数据源
 * @return {String} String
 * 
 * @example 
 * 代码示例1
 * const a = encryptionInfo("632323190605264544") // 632323******4544
 * 代码示例2
 * encryptionInfo("1530000000") // 135****0000
 *
 */
  static encryptionInfo = (val: string): string => {
    let oldVal: string = String(val), newVal: string;
    return oldVal.length === 11 ? oldVal.replace(/^(\d{3})\d+(\d{4})$/, "$1****$2") : oldVal.replace(/^(\d{6})\d+(\d{4})$/, "$1******$2");
  }

  /**
   * 获取文件名称和后缀
   * @param str 文件名称
   * @param findStr 通过某个字符分割文件后缀
   * @returns {
   * name 文件名称
   * suffix 文件后缀
   * }
   */
  static getSpecifyTxt(str: string, findStr = "."): fileType | null {
    if (!str) return null;
    const partition = str?.lastIndexOf(findStr);
    return {
      name: str.substring(0, partition),
      suffix: str.substring(partition, str.length)
    };
  }
}
